using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AviationTools._Airports._ObstructionIdentificationSurfaces
{
    /// <summary>
    /// <para>Unified Facilities Criteria</para>
    /// <para>Creates obstruction identification surfaces based on the Unified Facilities Criteria (UFC) 3-260-01 that is prescribed by MIL-STD 3007. These surfaces provide planning, design, construction, sustainment, restoration, and modernization criteria for the United States Department of Defense. Surfaces are created as polygon or multipatch features.</para>
    /// <para>根据 MIL-STD 3007 规定的统一设施标准 （UFC） 3-260-01 创建障碍物识别表面。这些表面为美国国防部提供规划、设计、建造、维护、修复和现代化标准。曲面将创建为面或多面体要素。</para>
    /// </summary>    
    [DisplayName("Unified Facilities Criteria")]
    public class UnifiedFacilitiesCriteria : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public UnifiedFacilitiesCriteria()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_runway_features">
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// </param>
        /// <param name="_target_ois_features">
        /// <para>Target OIS Features</para>
        /// <para>The existing output feature class that will contain the generated UFC surfaces.</para>
        /// <para>将包含生成的 UFC 曲面的现有输出要素类。</para>
        /// </param>
        /// <param name="_in_wing_type">
        /// <para>Wing Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the wing type of the aircraft.</para>
        ///   <bulletList>
        ///     <bullet_item>Fixed—The wing type is fixed.</bullet_item><para/>
        ///     <bullet_item>Rotary—The wing type is rotary.</bullet_item><para/>
        ///   </bulletList>
        ///   <para>If you choose Rotary, the Runway Class parameter will default to Class A without affecting the surface generation.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定飞机的机翼类型。</para>
        ///   <bulletList>
        ///     <bullet_item>固定 （Fixed） - 翼类型为固定。</bullet_item><para/>
        ///     <bullet_item>旋转 （Rotary） - 机翼类型为旋转式。</bullet_item><para/>
        ///   </bulletList>
        ///   <para>如果选择“旋转”（Rotary），则跑道类参数将默认为 A 类，而不会影响曲面生成。</para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_in_service_type">
        /// <para>Service Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of military service.</para>
        ///   <bulletList>
        ///     <bullet_item>Air Force—The service type is Air Force.</bullet_item><para/>
        ///     <bullet_item>Army—The service type is Army.</bullet_item><para/>
        ///     <bullet_item>Navy—The service type is Navy.</bullet_item><para/>
        ///     <bullet_item>Marine Corps—The service type is Marine Corps.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定兵役类型。</para>
        ///   <bulletList>
        ///     <bullet_item>Air Force - 服务类型为 Air Force。</bullet_item><para/>
        ///     <bullet_item>陆军 - 服务类型为陆军。</bullet_item><para/>
        ///     <bullet_item>海军 - 服务类型为海军。</bullet_item><para/>
        ///     <bullet_item>海军陆战队 - 服务类型为海军陆战队。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_in_runway_class">
        /// <para>Runway Class</para>
        /// <para><xdoc>
        ///   <para>Specifies the runway class. Runways are classified as either Class A or Class B based on aircraft type.</para>
        ///   <bulletList>
        ///     <bullet_item>Class A—The runway classification is Class A.</bullet_item><para/>
        ///     <bullet_item>Class B—The runway classification is Class B.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定跑道等级。跑道根据飞机类型分为 A 类或 B 类。</para>
        ///   <bulletList>
        ///     <bullet_item>A 类 - 跑道分类为 A 类。</bullet_item><para/>
        ///     <bullet_item>B 类 - 跑道分类为 B 类。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_in_flight_rule">
        /// <para>Flight Rule</para>
        /// <para><xdoc>
        ///   <para>Specifies the flight rule. The rules that govern the procedures for conducting flight, either instrument or under visual conditions.</para>
        ///   <bulletList>
        ///     <bullet_item>Instrument—The flight rule is instrument flight condition.</bullet_item><para/>
        ///     <bullet_item>Visual—The flight rule is visual flight condition.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定飞行规则。管理进行飞行程序的规则，无论是仪表还是目视条件。</para>
        ///   <bulletList>
        ///     <bullet_item>仪器 - 飞行规则是仪器飞行条件。</bullet_item><para/>
        ///     <bullet_item>视觉—飞行规则是视觉飞行条件。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public UnifiedFacilitiesCriteria(object _in_runway_features, object _target_ois_features, _in_wing_type_value? _in_wing_type, _in_service_type_value? _in_service_type, _in_runway_class_value? _in_runway_class, _in_flight_rule_value? _in_flight_rule)
        {
            this._in_runway_features = _in_runway_features;
            this._target_ois_features = _target_ois_features;
            this._in_wing_type = _in_wing_type;
            this._in_service_type = _in_service_type;
            this._in_runway_class = _in_runway_class;
            this._in_flight_rule = _in_flight_rule;
        }
        public override string ToolboxName => "Aviation Tools";

        public override string ToolName => "Unified Facilities Criteria";

        public override string CallName => "aviation.UnifiedFacilitiesCriteria";

        public override List<string> AcceptEnvironments => ["workspace"];

        public override object[] ParameterInfo => [_in_runway_features, _target_ois_features, _in_wing_type.GetGPValue(), _in_service_type.GetGPValue(), _in_runway_class.GetGPValue(), _in_flight_rule.GetGPValue(), _highend_clear_way_length, _lowend_clear_way_length, _airport_elevation, _out_ois_features, _custom_json_file, _airport_control_point_feature_class];

        /// <summary>
        /// <para>Input Runway Features</para>
        /// <para>The input runway dataset. The feature class must be z-enabled and contain polylines.</para>
        /// <para>输入跑道数据集。要素类必须启用 z 并包含折线。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Runway Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_runway_features { get; set; }


        /// <summary>
        /// <para>Target OIS Features</para>
        /// <para>The existing output feature class that will contain the generated UFC surfaces.</para>
        /// <para>将包含生成的 UFC 曲面的现有输出要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Target OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _target_ois_features { get; set; }


        /// <summary>
        /// <para>Wing Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the wing type of the aircraft.</para>
        ///   <bulletList>
        ///     <bullet_item>Fixed—The wing type is fixed.</bullet_item><para/>
        ///     <bullet_item>Rotary—The wing type is rotary.</bullet_item><para/>
        ///   </bulletList>
        ///   <para>If you choose Rotary, the Runway Class parameter will default to Class A without affecting the surface generation.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定飞机的机翼类型。</para>
        ///   <bulletList>
        ///     <bullet_item>固定 （Fixed） - 翼类型为固定。</bullet_item><para/>
        ///     <bullet_item>旋转 （Rotary） - 机翼类型为旋转式。</bullet_item><para/>
        ///   </bulletList>
        ///   <para>如果选择“旋转”（Rotary），则跑道类参数将默认为 A 类，而不会影响曲面生成。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Wing Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _in_wing_type_value? _in_wing_type { get; set; }

        public enum _in_wing_type_value
        {
            /// <summary>
            /// <para>Fixed</para>
            /// <para>Fixed—The wing type is fixed.</para>
            /// <para>固定 （Fixed） - 翼类型为固定。</para>
            /// </summary>
            [Description("Fixed")]
            [GPEnumValue("FIXED")]
            _FIXED,

            /// <summary>
            /// <para>Rotary</para>
            /// <para>Rotary—The wing type is rotary.</para>
            /// <para>旋转 （Rotary） - 机翼类型为旋转式。</para>
            /// </summary>
            [Description("Rotary")]
            [GPEnumValue("ROTARY")]
            _ROTARY,

        }

        /// <summary>
        /// <para>Service Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of military service.</para>
        ///   <bulletList>
        ///     <bullet_item>Air Force—The service type is Air Force.</bullet_item><para/>
        ///     <bullet_item>Army—The service type is Army.</bullet_item><para/>
        ///     <bullet_item>Navy—The service type is Navy.</bullet_item><para/>
        ///     <bullet_item>Marine Corps—The service type is Marine Corps.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定兵役类型。</para>
        ///   <bulletList>
        ///     <bullet_item>Air Force - 服务类型为 Air Force。</bullet_item><para/>
        ///     <bullet_item>陆军 - 服务类型为陆军。</bullet_item><para/>
        ///     <bullet_item>海军 - 服务类型为海军。</bullet_item><para/>
        ///     <bullet_item>海军陆战队 - 服务类型为海军陆战队。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Service Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _in_service_type_value? _in_service_type { get; set; }

        public enum _in_service_type_value
        {
            /// <summary>
            /// <para>Air Force</para>
            /// <para>Air Force—The service type is Air Force.</para>
            /// <para>Air Force - 服务类型为 Air Force。</para>
            /// </summary>
            [Description("Air Force")]
            [GPEnumValue("AIRFORCE")]
            _AIRFORCE,

            /// <summary>
            /// <para>Army</para>
            /// <para>Army—The service type is Army.</para>
            /// <para>陆军 - 服务类型为陆军。</para>
            /// </summary>
            [Description("Army")]
            [GPEnumValue("ARMY")]
            _ARMY,

            /// <summary>
            /// <para>Navy</para>
            /// <para>Navy—The service type is Navy.</para>
            /// <para>海军 - 服务类型为海军。</para>
            /// </summary>
            [Description("Navy")]
            [GPEnumValue("NAVY")]
            _NAVY,

            /// <summary>
            /// <para>Marine Corps</para>
            /// <para>Marine Corps—The service type is Marine Corps.</para>
            /// <para>海军陆战队 - 服务类型为海军陆战队。</para>
            /// </summary>
            [Description("Marine Corps")]
            [GPEnumValue("MARINECORPS")]
            _MARINECORPS,

        }

        /// <summary>
        /// <para>Runway Class</para>
        /// <para><xdoc>
        ///   <para>Specifies the runway class. Runways are classified as either Class A or Class B based on aircraft type.</para>
        ///   <bulletList>
        ///     <bullet_item>Class A—The runway classification is Class A.</bullet_item><para/>
        ///     <bullet_item>Class B—The runway classification is Class B.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定跑道等级。跑道根据飞机类型分为 A 类或 B 类。</para>
        ///   <bulletList>
        ///     <bullet_item>A 类 - 跑道分类为 A 类。</bullet_item><para/>
        ///     <bullet_item>B 类 - 跑道分类为 B 类。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Runway Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _in_runway_class_value? _in_runway_class { get; set; }

        public enum _in_runway_class_value
        {
            /// <summary>
            /// <para>Class A</para>
            /// <para>Class A—The runway classification is Class A.</para>
            /// <para>A 类 - 跑道分类为 A 类。</para>
            /// </summary>
            [Description("Class A")]
            [GPEnumValue("CLASS_A")]
            _CLASS_A,

            /// <summary>
            /// <para>Class B</para>
            /// <para>Class B—The runway classification is Class B.</para>
            /// <para>B 类 - 跑道分类为 B 类。</para>
            /// </summary>
            [Description("Class B")]
            [GPEnumValue("CLASS_B")]
            _CLASS_B,

        }

        /// <summary>
        /// <para>Flight Rule</para>
        /// <para><xdoc>
        ///   <para>Specifies the flight rule. The rules that govern the procedures for conducting flight, either instrument or under visual conditions.</para>
        ///   <bulletList>
        ///     <bullet_item>Instrument—The flight rule is instrument flight condition.</bullet_item><para/>
        ///     <bullet_item>Visual—The flight rule is visual flight condition.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定飞行规则。管理进行飞行程序的规则，无论是仪表还是目视条件。</para>
        ///   <bulletList>
        ///     <bullet_item>仪器 - 飞行规则是仪器飞行条件。</bullet_item><para/>
        ///     <bullet_item>视觉—飞行规则是视觉飞行条件。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Flight Rule")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _in_flight_rule_value? _in_flight_rule { get; set; }

        public enum _in_flight_rule_value
        {
            /// <summary>
            /// <para>Instrument</para>
            /// <para>Instrument—The flight rule is instrument flight condition.</para>
            /// <para>仪器 - 飞行规则是仪器飞行条件。</para>
            /// </summary>
            [Description("Instrument")]
            [GPEnumValue("INSTRUMENT")]
            _INSTRUMENT,

            /// <summary>
            /// <para>Visual</para>
            /// <para>Visual—The flight rule is visual flight condition.</para>
            /// <para>视觉—飞行规则是视觉飞行条件。</para>
            /// </summary>
            [Description("Visual")]
            [GPEnumValue("VISUAL")]
            _VISUAL,

        }

        /// <summary>
        /// <para>Length of High Runway End Clearway</para>
        /// <para>The length of the area at the high end of the runway. The unit of measurement is based on the input runway features.</para>
        /// <para>跑道高端区域的长度。测量单位基于输入跑道特征。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Length of High Runway End Clearway")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _highend_clear_way_length { get; set; } = 0;


        /// <summary>
        /// <para>Length of Low Runway End Clearway</para>
        /// <para>The length of the area at the low end of the runway. The unit of measurement is based on the input runway features.</para>
        /// <para>跑道低端区域的长度。测量单位基于输入跑道特征。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Length of Low Runway End Clearway")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _lowend_clear_way_length { get; set; } = 0;


        /// <summary>
        /// <para>Airport Elevation</para>
        /// <para>The highest elevation on any of the runways of the airport. The value should be given in the vertical coordinate system linear units of the target feature class. If no value is given, the highest point of the Input Runway Features parameter will be used.</para>
        /// <para>机场任何跑道上的最高海拔。该值应以目标要素类的垂直坐标系线性单位给出。如果未给出任何值，则将使用输入跑道要素参数的最高点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Airport Elevation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _airport_elevation { get; set; } = 0;


        /// <summary>
        /// <para>Output OIS Features</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output OIS Features")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_ois_features { get; set; }


        /// <summary>
        /// <para>Custom JSON File</para>
        /// <para>The import configuration, in JSON format, that creates the custom OIS.</para>
        /// <para>用于创建自定义 OIS 的 JSON 格式的导入配置。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Custom JSON File")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _custom_json_file { get; set; } = null;


        /// <summary>
        /// <para>Input Airport Control Point Feature</para>
        /// <para>The point features containing an Airport Elevation feature, displaced threshold features, or both. Values provided for the Airport Elevation parameter will take precedence over these point features.</para>
        /// <para>包含机场高程要素和/或位移阈值要素的点要素。为机场高程参数提供的值将优先于这些点要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Airport Control Point Feature")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _airport_control_point_feature_class { get; set; } = null;


        public UnifiedFacilitiesCriteria SetEnv(object workspace = null)
        {
            base.SetEnv(workspace: workspace);
            return this;
        }

    }

}